package admin

import (
	"geekai/api/dto/request"
	"geekai/api/dto/response"
	"geekai/api/handler"
	"geekai/core"
	"geekai/core/types"
	"geekai/model"
	"geekai/utils"
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
)

type MenuHandler struct {
	handler.BaseHandler
}

func NewMenuHandler(app *core.AppServer, db *gorm.DB) *MenuHandler {
	return &MenuHandler{BaseHandler: handler.BaseHandler{
		App: app,
		DB:  db,
	}}
}

// SaveOrUpdate godoc
// @Summary      创建或者更新系统菜单
// @Description  创建或者更新系统菜单
// @Tags         后台管理-系统菜单
// @Accept       json
// @Produce      json
// @Param        req   body     request.MenuSaveOrUpdateReq  true  "菜单信息"
// @Success      200  {object}  types.BizVo{}
// @Router       /api/admin/menu/saveOrUpdate [post]
// @Security AdminApiKeyAuth
func (h *MenuHandler) SaveOrUpdate(c *gin.Context) {
	var data request.MenuSaveOrUpdateReq
	if err := c.ShouldBindJSON(&data); err != nil {
		utils.ERROR(c, types.InvalidArgs)
		return
	}
	err := h.DB.Save(&model.Menu{
		Id:      data.Id,
		Name:    data.Name,
		Icon:    data.Icon,
		URL:     data.URL,
		SortNum: data.SortNum,
		Enabled: data.Enabled,
	}).Error
	if err != nil {
		utils.ERROR(c, "操作数据库失败："+err.Error())
		return
	}
	utils.SUCCESS(c)
}

// List godoc
// @Summary      查询菜单列表
// @Description  查询菜单列表
// @Tags         后台管理-系统菜单
// @Accept       json
// @Produce      json
// @Success      200  {object}  types.BizVo{data=[]response.Menu}
// @Router       /api/admin/menu/list [get]
// @Security AdminApiKeyAuth
func (h *MenuHandler) List(c *gin.Context) {
	var items []model.Menu
	var list = make([]response.Menu, 0)
	res := h.DB.Order("sort_num ASC").Find(&items)
	if res.Error == nil {
		for _, item := range items {
			var menuVo response.Menu
			err := utils.CopyObject(item, &menuVo)
			if err == nil {
				list = append(list, menuVo)
			}
		}
	}
	utils.SUCCESS(c, list)
}

// Enable godoc
// @Summary      开启|禁用菜单
// @Description  开启|禁用菜单
// @Tags         后台管理-系统菜单
// @Accept       json
// @Produce      json
// @Param        req   body     request.MenuEnableReq  true  "启用禁用信息"
// @Success      200  {object}  types.BizVo{}
// @Router       /api/admin/menu/enable [post]
// @Security AdminApiKeyAuth
func (h *MenuHandler) Enable(c *gin.Context) {
	var data request.MenuEnableReq
	if err := c.ShouldBindJSON(&data); err != nil {
		utils.ERROR(c, types.InvalidArgs)
		return
	}
	err := h.DB.Model(&model.Menu{}).Where("id", data.Id).Update("enabled", data.Enabled).Error
	if err != nil {
		utils.ERROR(c, "操作数据库失败："+err.Error())
		return
	}
	utils.SUCCESS(c)
}

// Sort godoc
// @Summary      菜单排序
// @Description  菜单排序
// @Tags         后台管理-系统菜单
// @Accept       json
// @Produce      json
// @Param        req   body     request.MenuSortReq  true  "菜单排序信息"
// @Success      200  {object}  types.BizVo{}
// @Router       /api/admin/menu/sort [post]
// @Security AdminApiKeyAuth
func (h *MenuHandler) Sort(c *gin.Context) {
	var data request.MenuSortReq
	if err := c.ShouldBindJSON(&data); err != nil {
		utils.ERROR(c, types.InvalidArgs)
		return
	}
	for index, id := range data.Ids {
		err := h.DB.Model(&model.Menu{}).Where("id", id).Update("sort_num", data.Sorts[index]).Error
		if err != nil {
			utils.ERROR(c, "操作数据库失败："+err.Error())
			return
		}
	}
	utils.SUCCESS(c)
}

// Remove godoc
// @Summary      删除菜单
// @Description  删除菜单
// @Tags         后台管理-系统菜单
// @Accept       json
// @Produce      json
// @Param        id   query     int  true  "菜单id"
// @Success      200  {object}  types.BizVo{}
// @Router       /api/admin/menu/remove [get]
// @Security AdminApiKeyAuth
func (h *MenuHandler) Remove(c *gin.Context) {
	id := h.GetInt(c, "id", 0)
	if id <= 0 {
		utils.ERROR(c, types.InvalidArgs)
		return
	}
	err := h.DB.Where("id", id).Delete(&model.Menu{}).Error
	if err != nil {
		utils.ERROR(c, "操作数据库失败："+err.Error())
		return
	}
	utils.SUCCESS(c)
}
